package com.lanzuo.pana.adapter.client.decoder;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

import java.nio.charset.StandardCharsets;

public class JsonMessageDecoder extends CumulativeProtocolDecoder {

    private static final int MAX_MESSAGE_SIZE = 1024 * 1024; // 1MB 限制

    @Override
    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
        // 标记当前位置，用于回滚
        in.mark();

        // 查找 \0 的位置
        int nullIndex = -1;
        int readable = in.remaining();

        // 安全检查：防止读取过多数据
        if (readable > MAX_MESSAGE_SIZE) {
            throw new IllegalArgumentException("Message too long, possibly missing \\0");
        }

        for (int i = 0; i < readable; i++) {
            if (in.get() == 0) {
                nullIndex = i;
                break;
            }
        }

        if (nullIndex == -1) {
            // 没找到 \0，说明消息不完整，回滚并等待更多数据
            in.reset();
            return false;
        }

        // 此时找到了 \0，从头读取到 \0 之前的数据
        int length = nullIndex;
        byte[] bytes = new byte[length];
        // 回到标记位置
        in.rewind();
        // 读取 JSON 字节
        in.get(bytes);
        // 跳过 \0
        in.get();

        String json = new String(bytes, StandardCharsets.UTF_8);
        // 传递给下一个处理器（Handler）
        out.write(json);

        // 返回 true 表示继续尝试解码下一个消息（处理粘包）
        return true;
    }
}
